home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-02 / gatekp.zip / GATEKPR2.PAS < prev    next >
Pascal/Delphi Source File  |  1993-01-04  |  5KB  |  239 lines

  1. {$O+,F+}
  2. unit gatekpr2;
  3.  
  4. (*                            Password Unit                                *)
  5. {              Public Domain Coding By Remi Aubuchon, 1990                  }
  6. {                         CompuServe # 71660,1016                                     }
  7.  
  8. interface
  9.  
  10. CONST
  11. VCHAR = '*';                     {Character that will echo on screen}
  12. DEFAULT_PASSWORD = 'NOPASSWORD'; {Will bypass Procedure}
  13.  
  14. TYPE
  15.   PassString = string[10];
  16.  
  17. Function Encode(Str:PassString):PassString; {Gives back an encoded version of the password}
  18. Function Decode(Str:PassString):PassString; {Gives back an decoded version of the password}
  19. Procedure Gate_Keeper(PassKey:PassString);  {Checks Password}
  20.  
  21. implementation
  22.  
  23. USES
  24.  Crt,WIN;
  25.  
  26. type
  27.  
  28.   TitleStrPtr = ^TitleStr;
  29.  
  30.   WinRecPtr = ^WinRec;
  31.   WinRec = record
  32.     Next: WinRecPtr;
  33.     State: WinState;
  34.     Title: TitleStrPtr;
  35.     TitleAttr, FrameAttr: Byte;
  36.     Buffer: Pointer;
  37.   end;
  38.  
  39. var
  40.   TopWindow: WinRecPtr;
  41.   WindowCount: Integer;
  42.   Done: Boolean;
  43.   Ch: Char;
  44.   Pass_Enter     : PassString;
  45.   Gate_Count     : ShortInt;
  46.   AOK            : BOOLEAN;
  47.  
  48. Function GetKey:CHAR;
  49. var key: char;
  50. begin
  51. key := ReadKey;
  52. If key = #0 then key := ReadKey; {If its a special function key}
  53. GetKey := key;
  54. end;
  55.  
  56. Procedure WriteAT(X,Y,F,B:BYTE;SayWhat:STRING);
  57. begin
  58. TextColor(F);
  59. TextBackground(B);
  60. GotoXY(X,Y);
  61. Writeln(SayWhat);
  62. end;
  63.  
  64. Procedure WriteCenter(y,f,b:BYTE;CntrString:STRING);
  65. VAR
  66. X:BYTE;
  67. begin
  68. X :=20-(LENGTH(CntrString) DIV 2);
  69. WriteAT(x,y,f,b,CntrString);
  70. end;
  71.  
  72. procedure OpenWindow(X1, Y1, X2, Y2: Byte; T: TitleStr;
  73.   TAttr, FAttr: Byte);
  74. var
  75.   W: WinRecPtr;
  76. begin
  77.   New(W);
  78.   with W^ do
  79.   begin
  80.     Next := TopWindow;
  81.     SaveWin(State);
  82.     GetMem(Title, Length(T) + 1);
  83.     Title^ := T;
  84.     TitleAttr := TAttr;
  85.     FrameAttr := FAttr;
  86.     Window(X1, Y1, X2, Y2);
  87.     GetMem(Buffer, WinSize);
  88.     ReadWin(Buffer^);
  89.     FrameWin(T, DoubleFrame, TAttr, FAttr);
  90.   end;
  91.   TopWindow := W;
  92.   Inc(WindowCount);
  93. end;
  94.  
  95. procedure CloseWindow;
  96. var
  97.   W: WinRecPtr;
  98. begin
  99.   if TopWindow <> nil then
  100.   begin
  101.     W := TopWindow;
  102.     with W^ do
  103.     begin
  104.       UnFrameWin;
  105.       WriteWin(Buffer^);
  106.       FreeMem(Buffer, WinSize);
  107.       FreeMem(Title, Length(Title^) + 1);
  108.       RestoreWin(State);
  109.       TopWindow := Next;
  110.     end;
  111.     Dispose(W);
  112.     Dec(WindowCount);
  113.   end;
  114. end;
  115.  
  116. Function Encode(Str:Passstring):Passstring;
  117. var
  118.   I : integer;
  119. begin
  120.     For I := 1 to 10 do
  121.     begin
  122.     CASE I OF
  123.     1,3,5,7,9: Str[I] := chr(ord(Str[I]) + 5);
  124.     2,4,6,8,10 : Str[I] := chr(ord(str[I])-5);
  125.     end;
  126.     end;
  127.     Encode := Str;
  128. end;
  129.  
  130. Function Decode(Str:Passstring):Passstring;
  131. var
  132.   I : integer;
  133. begin
  134.     For I := 1 to 10 do
  135.     begin
  136.     CASE I OF
  137.     1,3,5,7,9: Str[I] := chr(ord(Str[I]) - 5);
  138.     2,4,6,8,10 : Str[I] := chr(ord(str[I])+5);
  139.     end;
  140.     end;
  141.     Decode := Str;
  142. end;
  143. PROCEDURE Process( VAR RawPass: PassString);
  144.  CONST
  145.  FillString = '          ';
  146.  VAR
  147.   i: INTEGER;
  148.  
  149. begin
  150.   IF LENGTH (RawPass) < 10 THEN
  151.      RawPass := RawPass +COPY(FillString,1,10-LENGTH(RawPass));
  152.      FOR i := 1 to 10 DO
  153.      If ord(RawPass[I]) in [97..122] then
  154.            RawPass[I] := chr(ord(RawPass[I]) - 32);
  155. end;
  156.  
  157. PROCEDURE Pass_Check(VAR Pass_Enter: PassString);
  158.  VAR
  159.   PCcount: BYTE;
  160.   Ch: CHAR;
  161.  
  162.  BEGIN
  163.   Pass_Enter := '';
  164.   PCcount := 0;
  165.   ClrScr;
  166.   WriteAT(4, 3, Red, LightGray, 'Enter Password:');
  167.   REPEAT
  168.    GotoXY(20+PCcount,3);
  169.    Ch := GetKey;
  170.    IF ch <> #13 THEN
  171.     BEGIN
  172.      Pass_Enter := Pass_Enter + Ch;
  173.      WriteAT(20 + PCcount, 3, Red, LightGray, Vchar);
  174.      INC(PCcount);
  175.     END
  176.    ELSE
  177.     BEGIN
  178.      PCcount := 10;
  179.     END;
  180.   UNTIL PCcount = 10;
  181.     Process(Pass_Enter);
  182.  END;
  183.  
  184. PROCEDURE Gate_Keeper(Passkey: PassString);
  185.  
  186.  BEGIN
  187.   IF Passkey <> DEFAULT_PASSWORD THEN
  188.    BEGIN
  189.     Process(Passkey);
  190.     AOK := False;
  191.     Gate_Count := 0;
  192.     OpenWindow(20, 10, 60, 15, 'Password Required!',red, red);
  193.     REPEAT
  194.      Pass_Check(Pass_Enter);
  195.      IF Pass_Enter <> PassKey THEN
  196.     BEGIN
  197.          ClrScr;
  198.      WriteCenter(3, Red, black, 'Invalid Entry - Try Again!');
  199.      Sound(700);
  200.      Delay(200);
  201.      NoSound;
  202.      Delay(1000);
  203.      Pass_Enter := '';
  204.      INC(Gate_Count);
  205.     END
  206.      ELSE
  207.     BEGIN
  208.      Gate_Count := 2;
  209.      AOK := True;
  210.     END;
  211.     UNTIL Gate_Count = 2;
  212.     IF NOT AOK THEN
  213.      BEGIN
  214.     ClrScr;
  215.     WriteCenter(3, Red, black, 'Entry - Denied!');
  216.     Sound(100);
  217.     Delay(300);
  218.     NoSound;
  219.     Delay(2000);
  220.     CloseWindow;
  221.         ClrScr;
  222.     Halt(1); {That's it!}
  223.      END
  224.     ELSE
  225.      BEGIN
  226.         ClrScr;
  227.     WriteCenter(3, white, black, 'Welcome!');
  228.     Sound(1000);
  229.     Delay(100);
  230.     NoSound;
  231.     Delay(2000);
  232.     CloseWindow;
  233.         TextColor(lightgray);
  234.         TextBackground(black);
  235.      END;
  236.    END;
  237.  END;
  238.  
  239. END.